/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controller;

import exception.PersonnePresenteDansAscenseurException;
import exception.VitesseTropEleveException;
import ihm.PanelTraceExecution;
import java.util.List;
import java.util.TimerTask;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import model.AppelAscenseur;
import model.Ascenseur;

/**
 *
 * @author benoit
 */
public class TacheSimulation extends TimerTask {
    private SimulationControleur simuControleur;
    private AscenseurControleur ascenseurControleur;
    private AlgorithmeControleur algorithmeControleur;
    
    TacheSimulation(SimulationControleur simuControleur, AscenseurControleur ascenseurControleur, AlgorithmeControleur algorithmeControleur) {
        this.simuControleur = simuControleur;
        this.ascenseurControleur = ascenseurControleur;
        this.algorithmeControleur = algorithmeControleur;
    }
    
    @Override
    public void run() {
        List<AppelAscenseur> appelsAscenseur = simuControleur.getCurrentAppelAscenseur();
        Ascenseur ascenseurChoisi = null;
        
        /* Traitement des appels effectués */
        if(appelsAscenseur != null){
            for(AppelAscenseur a : appelsAscenseur) {
                ascenseurChoisi = algorithmeControleur.choisirAscenseur(a.getAlgorithmeUtilise(), a);
                ascenseurControleur.ajouterAppelAscenseur(ascenseurChoisi.getNumero(),a);
                PanelTraceExecution.ecrireTraceExecution("Un appel a été affecté à l'acenseur " + ascenseurChoisi.getNumero() + ": \n\t" + a);
            }
        }
        
        /* Maj position ascenseur */
        try {
            ascenseurControleur.majPositionAscenseurs();
        } catch (VitesseTropEleveException ex) {
            Logger.getLogger(TacheSimulation.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Erreur de l'application", JOptionPane.ERROR_MESSAGE);
        } catch (PersonnePresenteDansAscenseurException ex) {
            Logger.getLogger(TacheSimulation.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Erreur de l'application", JOptionPane.ERROR_MESSAGE);
        }
        
        /* Incrémentation de l'heure de la simulation */
        if(!simuControleur.incrementerDate()) {
            simuControleur.arreter();
        }
    }
}
